package cglib;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CCTVMeiPo implements MethodInterceptor {


    /**
     * 同样是做了字节码重组，对使用者来说是无感知的
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("我是CGlib媒婆");
        System.out.println("开始海选……");
        // 这个obj的引用是由CGlib给我们new出来的
        // cglib new出来的对象是被代理对象的子类（继承了我们自己写的那个类）
        // OOP 在new子类之前，实际上默认先调用了super方法
        // new子类的同时，必须先new出父类，这就是相当于简介的持有了我们的父类的引用
        // 子类重写了父类的所有方法
        // 我们改变子类对象的某些属性，是可以间接操作父类的属性
        methodProxy.invokeSuper(obj,args);
        System.out.println("匹配上了");

        return null;
    }

    public Object getInstance(Class clazz) throws  Exception {
        Enhancer enhancer = new Enhancer();
        // 把父类设置为谁
        // 这一步就是告诉cglib 生成的子类需要继承哪个类
        enhancer.setSuperclass(clazz);
        // 设置回调
        enhancer.setCallback(this);
        // 1 生成源代码
        // 2 编译成class文件
        // 3 加载到jvm中并返回被代理对象
        return enhancer.create();
    }
}
